INDICACIONES

Librerías requeridas

install.packages("packagename")
if (!require("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install(version = "3.16")
BiocManager::install("packagename")
devtools::install_github("kassambara/ggpubr")

Las librerías requeridas en esta evaluación son:

library(ggpmisc); library(ggplot2); library(plotly); library(palmerpenguins)
## Loading required package: ggpp
## Loading required package: ggplot2
## 
## Attaching package: 'ggpp'
## The following object is masked from 'package:ggplot2':
## 
##     annotate
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(ggplot2); library(magrittr); library(ggpubr); library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.0     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.1.8
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggpp::annotate()   masks ggplot2::annotate()
## ✖ tidyr::extract()   masks magrittr::extract()
## ✖ dplyr::filter()    masks plotly::filter(), stats::filter()
## ✖ dplyr::lag()       masks stats::lag()
## ✖ purrr::set_names() masks magrittr::set_names()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(ComplexHeatmap); library(viridis)
## Loading required package: grid
## ========================================
## ComplexHeatmap version 2.14.0
## Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
## Github page: https://github.com/jokergoo/ComplexHeatmap
## Documentation: http://jokergoo.github.io/ComplexHeatmap-reference
## 
## If you use it in published research, please cite either one:
## - Gu, Z. Complex Heatmap Visualization. iMeta 2022.
## - Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional 
##     genomic data. Bioinformatics 2016.
## 
## 
## The new InteractiveComplexHeatmap package can directly export static 
## complex heatmaps into an interactive Shiny app with zero effort. Have a try!
## 
## This message can be suppressed by:
##   suppressPackageStartupMessages(library(ComplexHeatmap))
## ========================================
## 
## 
## Attaching package: 'ComplexHeatmap'
## 
## The following object is masked from 'package:plotly':
## 
##     add_heatmap
## 
## Loading required package: viridisLite

[4.0 PUNTOS] 1. Pingüinos de Palmer

La base de datos de esta pregunta contiene distintas mediciones para tres especies de pingüinos encontrados en el archipiélago de Palmer, en la Antártica. Estas tres especies son los Chinstrap, Gentoo y Adélie.

Puede revisar los datos de los pingüinos utilizando la instrucción str() o skim().

skimr::skim(penguins)
Data summary
Name penguins
Number of rows 344
Number of columns 8
_______________________
Column type frequency:
factor 3
numeric 5
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
species 0 1.00 FALSE 3 Ade: 152, Gen: 124, Chi: 68
island 0 1.00 FALSE 3 Bis: 168, Dre: 124, Tor: 52
sex 11 0.97 FALSE 2 mal: 168, fem: 165

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
bill_length_mm 2 0.99 43.92 5.46 32.1 39.23 44.45 48.5 59.6 ▃▇▇▆▁
bill_depth_mm 2 0.99 17.15 1.97 13.1 15.60 17.30 18.7 21.5 ▅▅▇▇▂
flipper_length_mm 2 0.99 200.92 14.06 172.0 190.00 197.00 213.0 231.0 ▂▇▃▅▂
body_mass_g 2 0.99 4201.75 801.95 2700.0 3550.00 4050.00 4750.0 6300.0 ▃▇▆▃▂
year 0 1.00 2008.03 0.82 2007.0 2007.00 2008.00 2009.0 2009.0 ▇▁▇▁▇

A continuación se muestra un ejemplo de análisis de la data de los pingüinos de Palmer:

ggarrange(p3, ggarrange(p1, p2, labels =c(“b”, “c”), nrow=2),

labels = “a”, ncol=2)

## `geom_smooth()` using formula = 'y ~ x'

[1.0 punto] 1.1. Interprete lo que se muestra en la figura anterior

INTERPRETACIÓN

En el grafico p1 se realiza un analisis de errores estándar entre el ancho del pico y el largo del pico de diferentes especies y su sexo. El color de cada linea está representado por la variable sex, lo que nos dice los diferentes puntos de color está determinado por los diferentes sexos de los pingüinos. Donde se muestra la relación entre la longitud del pico y la profundidad del pico. La dispersión tiene una línea de regresión lineal de mejor ajuste y un valor R cuadrado ajustado.

En la figura p2, se realiza una comparación entre la longitud de los picos con las especies de pinguino, cada color representa una especie de pingüino. En este gráfico de caja y bigotes, se comparan los puntos de datos entre diferentes especies. En este caso, el parámetro x se utiliza para especificar las especies que se quieren comparar, mientras que el parámetro y especifica los puntos de datos que se quieren comparar entre cada especie.

En la figura p3 se empieza con la definición de los datos utilizados para el gráfico (pinguinos) junto con las variables que se asignarán a los ejes x e y (bill_length_mm y bill_depth_mm respectivamente). El color de los puntos del gráfico viene determinado por la variable especie. la función stat_poly_eq para calcular una ecuación polinómica de los datos y mostrarla en el gráfico.

[3.0 puntos] 1.2. Genere dos gráficas p4 y p5donde:

  • p4 es una regresión de x: body_mass_g y y: flipper_length_mm, que tiene inserto la ecuación de la regresión y el \(R^2\). Asimismo tiene una coloración por sexo, y una separación por sexo e isla.

  • p5 tiene un correlation plot de las variables numéricas de longitud de pico, ancho de pico, longitud de aleta y masa corporal. La figura tiene que tener la apariencia de la imagen de abajo, este se encuentra resuelto en la página de ggcorrplot.

  • Realice una composición de figuras que se indica en la figura de abajo e interprete.
# Escriba aquí su código


p4 <- ggplot(penguins, aes(x = body_mass_g, y = flipper_length_mm, color = sex)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", formula = y ~ x, se = FALSE, na.rm = TRUE) +
  scale_color_manual(values = c("#2596be", "#873e23")) +
  facet_grid(rows = vars(sex), cols = vars(island)) +
  labs(title = "Relación entre masa corporal y longitud de aleta de pingüinos",
       x = "Masa corporal (g)", y = "Longitud de aleta (mm)",
       color = "Sexo") +
  theme_bw() +
  theme(text = element_text(size = 12), legend.position = "bottom") +
  stat_poly_eq(formula = y ~ x, aes(label = paste(stat(eq.label), stat(adj.rr.label), sep = "*\", \"*")),
               label.x = "right", label.y = "top", size = 4)
library(ggcorrplot)
penguins_clean <- na.omit(penguins)
penguins_num <- penguins_clean[, c(3, 4, 5, 6)]
penguins_corr <- cor(penguins_num)

p5 <- ggcorrplot(penguins_corr, type = "upper", hc.order = TRUE, lab = TRUE, lab_size = 5, 
                 ggtheme = ggplot2::theme_gray, colors = c("blue", "white", "red"))
ggarrange(p3, p1 , ggarrange(p5, p4, p2, labels =c("p5", "p4", "p2"), nrow=3), 
          labels =c("p3", "p1"), ncol=3)
## Warning: `stat(eq.label)` was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(eq.label)` instead.
## Warning: Removed 2 rows containing non-finite values (`stat_poly_eq()`).
## Warning: Not enough data to perform fit for group 3; computing mean instead.
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 16 rows containing non-finite values (`stat_boxplot()`).
## Warning: Removed 21 rows containing missing values (`geom_point()`).
## `geom_smooth()` using formula = 'y ~ x'
## Warning in coefs2poly_eq(coefs = coefs, coef.digits = coef.digits,
## coef.keep.zeros = coef.keep.zeros, : 'coef.digits < 3' Likely information loss!
## Warning in coefs2poly_eq(coefs = coefs, coef.digits = coef.digits,
## coef.keep.zeros = coef.keep.zeros, : 'coef.digits < 3' Likely information loss!

## Warning in coefs2poly_eq(coefs = coefs, coef.digits = coef.digits,
## coef.keep.zeros = coef.keep.zeros, : 'coef.digits < 3' Likely information loss!

## Warning in coefs2poly_eq(coefs = coefs, coef.digits = coef.digits,
## coef.keep.zeros = coef.keep.zeros, : 'coef.digits < 3' Likely information loss!

## Warning in coefs2poly_eq(coefs = coefs, coef.digits = coef.digits,
## coef.keep.zeros = coef.keep.zeros, : 'coef.digits < 3' Likely information loss!

INTERPRETACIÓN

El gráfico p4 muestra la relación entre la masa corporal y la longitud de la aleta de los pingüinos. Cada punto en el gráfico representa un pingüino y está coloreado según su sexo, con machos en azul y hembras en marrón. El gráfico también está dividido en paneles según la isla de origen del pingüino.

Se puede observar que hay una relación positiva entre la masa corporal y la longitud de la aleta, lo que sugiere que los pingüinos más grandes tienen aletas más largas. Además, la línea de regresión ajustada (en azul para machos y en marrón para hembras) muestra una pendiente positiva en ambos casos, lo que indica que la relación entre la masa corporal y la longitud de la aleta es similar para ambos sexos.

[4.0 PUNTOS] 2. MAPAS DE CALOR DE EXPRESIÓN GÉNICA

Los datos de expresión de genes son extensos, hay una gran cantidad de genes y asimismo una gran cantidad de muestras de tejidos o lineas celulares. En este ejemplo se desea ver el nivel de relación de las muestras de diferentes tipos de tejidos en base a las cuantificaciones de niveles de expresión genética. La data ejemplo es sintética, y están guardadas en forma de tablas y se cargan con la función load('nombre.RData'). Está basado en Simple guide to heatmaps.

load('data/expression.Rdata') # carga la tabla de expression
load('data/metadata.Rdata')
str(expression)
## rowws_df [2,191 × 11] (S3: rowwise_df/tbl_df/tbl/data.frame)
##  $ Gene: chr [1:2191] "ABCA1" "ABCA10" "ABCA13" "ABCA2" ...
##  $ X10 : num [1:2191] 13.97 10.88 9.17 11.34 8.77 ...
##  $ X11 : num [1:2191] 12.24 8.81 7.63 14.98 11.64 ...
##  $ X16 : num [1:2191] 12.63 11.25 7.49 13.68 11.29 ...
##  $ X17 : num [1:2191] 13.18 9.87 8.13 12.01 8.07 ...
##  $ X18 : num [1:2191] 11.38 8.06 8.26 16.01 12.39 ...
##  $ X2  : num [1:2191] 12.33 9.35 6.43 13.44 10.13 ...
##  $ X3  : num [1:2191] 13.48 11.25 9.96 12.26 10.13 ...
##  $ X4  : num [1:2191] 11.38 8.59 7.5 16.01 11.51 ...
##  $ X9  : num [1:2191] 10.98 9.48 7.08 15.39 11.34 ...
##  $ var : num [1:2191] 1.06 1.39 1.15 3.17 2.04 ...

Esta data indica el nivel de expressión de los genes (filas) en cada muestra de células (columnas).

# El procesamiento es:
# 1. seleccionar solamente las muestras select()
# 2. transponer t()
# 3. calcula las distancias encluideanas basado en las medidas dis()
# 4. hacer que se vuelva una matriz de tipo dataframe
expr_dist <- expression %>% select(-Gene, -var) %>% 
  t() %>% 
  dist() %>% 
  as.matrix() %>% data.frame() 
dim(expr_dist)
## [1] 9 9

Se realiza un gráfico de mapa de calor preliminar que permite tener un primer vistazo del nivel de relación entre cada una de las muestras en base a la distancia euclideana.

Heatmap(expr_dist)
## Warning: The input is a data frame-like object, convert it to a matrix.

Usualmente lo que se desea es saber si las muestras vienen de diferentes tejidos

metadata_heatmap <- metadata  %>% 
  mutate(sample = paste0('X', sample)) %>% # nombres de muestras
  filter(sample %in% colnames(expr_dist)) %>% 
  dplyr::select(sample, treatment_hours, serum) %>% 
  mutate(sample=factor(sample, levels=colnames(expr_dist))) %>% 
  arrange(sample) %>%  unique() 

ha_column = HeatmapAnnotation(df = data.frame(Tiempo = metadata_heatmap$treatment_hours,
                                              Suero = metadata_heatmap$serum), 
                              col = list(Serum = c("HS" =  magma(20)[2], "HIHS" = magma(20)[3]),
                                         Time = c("24" = magma(20)[14], "48" = magma(20)[12])))

# Mapa de calor anotado en la parte superior
Heatmap(expr_dist,  col=viridis(10), 
        name = 'Distancias', top_annotation = ha_column, )
## Warning: The input is a data frame-like object, convert it to a matrix.

[1.0 punto] 2.1. Interpretación del Mapa de calor

Realice una descripción de lo que observa en el mapa de calor considerando:

  • las intensidades de color de las distancias,

  • el tiempo de exposición al tratamiento

  • el tipo de suero

INTERPRETACIÓN:

En el mapa de calor, los valores de las distancias están representados por colores, donde los tonos más oscuros indican distancias más grandes y los tonos más claros indican distancias más pequeñas.

En la parte superior del mapa de calor, hay dos anotaciones: “Tiempo” y “Suero”. “Tiempo” indica el tiempo de exposición al tratamiento y está representado por dos colores: el morado oscuro para 24 horas y el morado claro para 48 horas. “Suero” indica el tipo de suero utilizado y está representado por dos colores: el naranja oscuro para HS y el naranja claro para HIHS.

[3.0 puntos] 2.2. Mapa de calor artritis reumatoide.

Realice la réplica e interpretación de los niveles de expresión génica en muestras de personas que sufren de artritits reumatoide; que se muestra en la sección 5 de la página A simple tutorial for a complex ComplexHeatmap y que se basa en el artículo Volume 28, Issue 9, 27 August 2019, Pages 2455-2470.e5.

require(RColorBrewer); require(ComplexHeatmap); require(circlize); 
## Loading required package: RColorBrewer
## Loading required package: circlize
## ========================================
## circlize version 0.4.15
## CRAN page: https://cran.r-project.org/package=circlize
## Github page: https://github.com/jokergoo/circlize
## Documentation: https://jokergoo.github.io/circlize_book/book/
## 
## If you use it in published research, please cite:
## Gu, Z. circlize implements and enhances circular visualization
##   in R. Bioinformatics 2014.
## 
## This message can be suppressed by:
##   suppressPackageStartupMessages(library(circlize))
## ========================================
require(digest); require(cluster)
## Loading required package: digest
## Loading required package: cluster

Aquí se carga los datos EMTAB6141.rdata que se requiere para este ejercicio. Requieres usar:

  • 'mat.tsv'

  • 'metadata.tsv'

  • 'sig_genes.list'

# Cargue aquí sus datos

En la siguiente celda de código, realice la réplica del mapa de calor que se encuentra a la izquierda (hmap1) de esta figura:

# Escriba aquí sus códigos

INTERPRETACIÓN:

[2 PUNTOS] REPOSITORIO GITHUB

Su repositorio de GitHub debe tener al menos los sigueites elementos: